home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / LINEA.I < prev    next >
Encoding:
Modula Implementation  |  1990-11-24  |  11.0 KB  |  407 lines

  1. IMPLEMENTATION MODULE LineA;
  2. (*$L-, N+, Y+*)
  3.  
  4.  
  5. (*  Implementierung der Line-A-Routinen für MEGAMAX Modula-2
  6.  *
  7.  *  Autor: Manuel Chakravarty
  8.  *
  9.  *  Created: 7.4.1987           Version 2.1     V#0100
  10.  *)
  11.  
  12. (*  18.08.89 MCH V2.0   | 'NegLineAVariables' def. + impl.
  13.  *  ???????? TT  V2.1   | REF-Parm.
  14.  *  17.02.90 TT         | A6 wird nun gerettet, weil LineA das Reg u.U. zerstört
  15.  *  24.11.90 TT         | BREAK aus PutPixel entfernt!
  16.  *)
  17.  
  18.  
  19. FROM    SYSTEM          IMPORT ASSEMBLER, ADDRESS;
  20.  
  21. FROM    GrafBase        IMPORT Point, Rectangle, PtrMouseFormDef,
  22.                                PtrMemFormDef;
  23.  
  24.  
  25. CONST   opcodeBase      = $A000;
  26.  
  27. TYPE    lineAFunc       = (init, putPixel, getPixel, line, horLine, fillRect,
  28.                            fillPolygon, bitBlt, textBlt, showMouse, hideMouse,
  29.                            transMouse, undrawSprite, drawSprite, copyRaster,
  30.                            contourFill);
  31.                           
  32. CONST   initCode        = opcodeBase + CARDINAL (init);
  33.         putPixelCode    = opcodeBase + CARDINAL (putPixel);
  34.         getPixelCode    = opcodeBase + CARDINAL (getPixel);
  35.         lineCode        = opcodeBase + CARDINAL (line);
  36.         horLineCode     = opcodeBase + CARDINAL (horLine);
  37.         fillRectCode    = opcodeBase + CARDINAL (fillRect);
  38.         fillPolygonCode = opcodeBase + CARDINAL (fillPolygon);
  39.         bitBltCode      = opcodeBase + CARDINAL (bitBlt);
  40.         textBltCode     = opcodeBase + CARDINAL (textBlt);
  41.         showMouseCode   = opcodeBase + CARDINAL (showMouse);
  42.         hideMouseCode   = opcodeBase + CARDINAL (hideMouse);
  43.         transMouseCode  = opcodeBase + CARDINAL (transMouse);
  44.         undrawSpriteCode= opcodeBase + CARDINAL (undrawSprite);
  45.         drawSpriteCode  = opcodeBase + CARDINAL (drawSprite);
  46.         copyRasterCode  = opcodeBase + CARDINAL (copyRaster);
  47.         contourFillCode = opcodeBase + CARDINAL (contourFill);
  48.  
  49. VAR     jmpTable        : ARRAY lineAFunc OF ADDRESS;
  50.         sysFontHeader   : PtrSysFontHeader;
  51.         lineAVars       : PtrLineAVars;
  52.         
  53.         ImprovedCall    : BOOLEAN;
  54.         
  55.        
  56. PROCEDURE SystemFonts (): PtrSysFontHeader;
  57.  
  58.   BEGIN
  59.     ASSEMBLER
  60.         MOVE.L  sysFontHeader,(A3)+
  61.     END;
  62.   END SystemFonts;
  63.  
  64. PROCEDURE LineAVariables (): PtrLineAVars;
  65.  
  66.   BEGIN
  67.     ASSEMBLER
  68.         MOVE.L  lineAVars,(A3)+
  69.     END;
  70.   END LineAVariables;
  71.  
  72. PROCEDURE NegLineAVariables (): PtrNegLineAVars;
  73.  
  74.   BEGIN
  75.     ASSEMBLER
  76.         MOVE.L  lineAVars, D0
  77.         SUBI.L  #$2E, D0
  78.         MOVE.L  D0, (A3)+
  79.     END;
  80.   END NegLineAVariables;
  81.  
  82.  
  83. (* Normaller Aufruf 117 microsec, 'ImprovedCall' 86 microsec *)
  84. PROCEDURE PutPixel(p:Point;color:CARDINAL);
  85.  
  86. BEGIN
  87.   ASSEMBLER
  88.         MOVE.L  lineAVars,A0
  89.         LEA     -6(A3),A1
  90.         MOVE.L  A1,LineAVars.ptsin(A0)
  91.         ADDQ.L  #4,A1
  92.         MOVE.L  A1,LineAVars.intin(A0)
  93.         TST.W   ImprovedCall
  94.         BNE     improved
  95.         MOVE.L  A6, -(A7)
  96.         DC.W    putPixelCode
  97.         MOVE.L  (A7)+, A6
  98.         BRA     ready
  99. improved
  100.         MOVE.L  jmpTable,A0
  101.         MOVE.W  #putPixel,D0
  102.         LSL.W   #2,D0
  103.         ADDA.W  D0,A0
  104.         MOVE.L  (A0),A0
  105.         JSR     (A0)
  106. ready
  107.         SUBQ.L  #6,A3
  108.   END;
  109. END PutPixel;
  110.  
  111. PROCEDURE PixelColor(p:Point):CARDINAL;
  112.  
  113. BEGIN
  114.   ASSEMBLER
  115.         MOVE.L  lineAVars,A0
  116.         LEA     -4(A3),A1
  117.         MOVE.L  A1,LineAVars.ptsin(A0)
  118.         TST.W   ImprovedCall
  119.         BNE     improved
  120.         MOVE.L  A6, -(A7)
  121.         DC.W    getPixelCode
  122.         MOVE.L  (A7)+, A6
  123.         BRA     ready
  124. improved
  125.         MOVE.L  jmpTable,A0
  126.         MOVE.W  #getPixel,D0
  127.         LSL.W   #2,D0
  128.         ADDA.W  D0,A0
  129.         MOVE.L  (A0),A0
  130.         JSR     (A0)
  131. ready
  132.         SUBQ.L  #2,A3
  133.         MOVE.W  D0,-2(A3)
  134.   END;
  135. END PixelColor;
  136.  
  137. PROCEDURE Line(p,q:Point);
  138.  
  139. BEGIN
  140.   ASSEMBLER
  141.         MOVE.L  lineAVars,A0
  142.         MOVE.L  -(A3),LineAVars.q.x(A0)
  143.         MOVE.L  -(A3),LineAVars.p.x(A0)
  144.         MOVE.L  A6, -(A7)
  145.         DC.W    lineCode
  146.         MOVE.L  (A7)+, A6
  147.   END;
  148. END Line;
  149.  
  150. PROCEDURE HorizontalLine(x1,x2,y:INTEGER);
  151.  
  152. BEGIN
  153.   ASSEMBLER
  154.         MOVE.L  lineAVars,A0
  155.         MOVE.W  -(A3),LineAVars.p.y(A0)
  156.         MOVE.W  -(A3),LineAVars.q.x(A0)
  157.         MOVE.W  -(A3),LineAVars.p.x(A0)
  158.         MOVE.L  A6, -(A7)
  159.         DC.W    horLineCode
  160.         MOVE.L  (A7)+, A6
  161.   END;
  162. END HorizontalLine;
  163.  
  164. PROCEDURE FilledRectangle(p,q:Point);
  165.  
  166. BEGIN
  167.   ASSEMBLER
  168.         MOVE.L  lineAVars,A0
  169.         MOVE.L  -(A3),LineAVars.q.x(A0)
  170.         MOVE.L  -(A3),LineAVars.p.x(A0)
  171.         MOVE.L  A6, -(A7)
  172.         DC.W    fillRectCode
  173.         MOVE.L  (A7)+, A6
  174.   END;
  175. END FilledRectangle;
  176.  
  177. PROCEDURE FilledPolygon(REF pts:ARRAY OF Point;noPts:CARDINAL;y:INTEGER);
  178.  
  179. BEGIN
  180.   ASSEMBLER
  181.         MOVE.L  lineAVars,A0
  182.         MOVE.W  -(A3),LineAVars.p.y(A0)
  183.         CLR.L   D0
  184.         MOVE.W  -(A3),D0
  185.         MOVE.W  -(A3),D1
  186.         TST.W   D0
  187.         BEQ     takeHIGH
  188.         CMP.W   D0,D1
  189.         BCC     takeNoPts
  190. takeHIGH
  191.         MOVE.W  D1,D0
  192. takeNoPts
  193.         MOVE.L  D0,-(A7)
  194.         MOVE.L  A7,LineAVars.contrl(A0)
  195.         MOVE.L  -(A3),LineAVars.ptsin(A0)
  196.         MOVE.L  A6, -(A7)
  197.         DC.W    fillPolygonCode
  198.         MOVE.L  (A7)+, A6
  199.         ADDQ.L  #4,A7
  200.   END;
  201. END FilledPolygon;
  202.  
  203. PROCEDURE BitBlockTransfer(deskriptor:PtrBBTDeskriptor);
  204.  
  205. BEGIN
  206.   ASSEMBLER
  207.         MOVE.L  A6,-(A7)
  208.         
  209.         MOVE.L  -(A3),A0
  210.         MOVE.L  A0,A6
  211.         MOVE.L  A6, -(A7)
  212.         DC.W    bitBltCode
  213.         MOVE.L  (A7)+, A6
  214.         
  215.         MOVE.L  (A7)+,A6
  216.   END;
  217. END BitBlockTransfer;
  218.  
  219. PROCEDURE TextBlockTransfer(font:PtrFontHeader;ch:CHAR;spot:Point);
  220.  
  221. CONST   horOffFlag      = 1;
  222.  
  223. BEGIN
  224.   ASSEMBLER
  225.         MOVE.L  lineAVars,A0
  226.         MOVE.L  -(A3),LineAVars.dest(A0) ; 'spot' -> dest
  227.         SUBQ.L  #1,A3
  228.         CLR.W   D0
  229.         MOVE.B  -(A3),D0                ; 'ch' -> D0
  230.         MOVE.L  -(A3),A1                ; 'font' -> A1
  231.         MOVE.L  FontHeader.charOffsetTab(A1),A2
  232.         
  233.         CMP.W   FontHeader.maxADE(A1),D0 ; Bereichscheck
  234.         BHI.W   err
  235.         SUB.W   FontHeader.minADE(A1),D0 ; und Indexberechnung
  236.         BCS.W   err
  237.         ADD.W   D0,D0
  238.         
  239.         BTST    #horOffFlag,FontHeader.flags(A1)
  240.         BEQ     noHorOff
  241.         MOVE.W  LineAVars.dest.x(A0),D1
  242.         SUB.W   0(A2,D0.W),D1
  243.         MOVE.W  D1,LineAVars.dest.x(A0)
  244. noHorOff
  245.  
  246.         MOVE.W  0(A2,D0.W),D1           ; source Berechnung
  247.         MOVE.W  D1,LineAVars.source.x(A0)
  248.         CLR.W   LineAVars.source.y(A0)
  249.         ADDQ.W  #2,D0
  250.         MOVE.W  0(A2,D0.W),D0
  251.         SUB.W   D1,D0
  252.         MOVE.W  D0,LineAVars.width(A0)
  253.         MOVE.W  FontHeader.formHeight(A1),LineAVars.height(A0)
  254.         
  255.         MOVE.L  FontHeader.fontData(A1),LineAVars.formBase(A0)
  256.         MOVE.W  FontHeader.formWidth(A1),LineAVars.formWidth(A0)
  257.         MOVE.W  FontHeader.leftOffset(A1),LineAVars.leftOff(A0)
  258.         MOVE.W  FontHeader.rightOffset(A1),LineAVars.rightOff(A0)
  259.         MOVE.W  FontHeader.lightMask(A1),LineAVars.lightMask(A0)
  260.         MOVE.W  FontHeader.skewMask(A1),LineAVars.skewMask(A0)
  261.         MOVE.W  FontHeader.thickening(A1),LineAVars.weight(A0)
  262.   
  263.         MOVE.L  A6, -(A7)
  264.         DC.W    textBltCode
  265.         MOVE.L  (A7)+, A6
  266. err
  267.   END;
  268. END TextBlockTransfer;
  269.  
  270. PROCEDURE ShowMouse(force:BOOLEAN);
  271.  
  272. BEGIN
  273.   ASSEMBLER
  274.         MOVE.L  lineAVars,A0
  275.         MOVE.L  #1,-(A7)
  276.         CLR.L   -(A7)
  277.         MOVE.L  A7,LineAVars.contrl(A0)
  278.         MOVE.W  -(A3),D0
  279.         EORI.W  #1,D0
  280.         MOVE.W  D0,-(A7)
  281.         MOVE.L  A7,LineAVars.intin(A0)
  282.         
  283.         MOVE.L  A6, -(A7)
  284.         DC.W    showMouseCode
  285.         MOVE.L  (A7)+, A6
  286.         ADDA.W  #10,A7
  287.   END;
  288. END ShowMouse;
  289.  
  290. PROCEDURE HideMouse;
  291.  
  292. BEGIN
  293.   ASSEMBLER
  294.         MOVE.L  A6, -(A7)
  295.         DC.W    hideMouseCode
  296.         MOVE.L  (A7)+, A6
  297.   END;
  298. END HideMouse;
  299.  
  300. PROCEDURE TransformMouse(newForm:PtrMouseFormDef);
  301.  
  302. BEGIN
  303.   ASSEMBLER
  304.         MOVE.L  lineAVars,A0
  305.         MOVE.L  #37,-(A7)
  306.         CLR.L   -(A7)
  307.         MOVE.L  A7,LineAVars.contrl(A0)
  308.         MOVE.L  -(A3),LineAVars.intin(A0)
  309.         
  310.         MOVE.L  A6, -(A7)
  311.         DC.W    transMouseCode
  312.         MOVE.L  (A7)+, A6
  313.         ADDQ.L  #8,A7
  314.   END;
  315. END TransformMouse;
  316.  
  317. PROCEDURE UndrawSprite(buffer:PtrSpriteBuffer);
  318.  
  319. BEGIN
  320.   ASSEMBLER
  321.         MOVE.L  -(A3),A2
  322.         MOVE.L  A6, -(A7)
  323.         DC.W    undrawSpriteCode
  324.         MOVE.L  (A7)+, A6
  325.   END;
  326. END UndrawSprite;
  327.  
  328. PROCEDURE DrawSprite(hotSpot:Point;sprite:PtrSpriteDef;buffer:PtrSpriteBuffer);
  329.  
  330. BEGIN
  331.   ASSEMBLER
  332.         MOVE.L  -(A3),A2
  333.         MOVE.L  -(A3),A0
  334.         MOVE.W  -(A3),D1
  335.         MOVE.W  -(A3),D0
  336.         MOVE.L  A6, -(A7)
  337.         DC.W    drawSpriteCode
  338.         MOVE.L  (A7)+, A6
  339.   END;
  340. END DrawSprite;
  341.  
  342. PROCEDURE CopyRasterForm (sourceMem,destMem:PtrMemFormDef;
  343.                           sourceStart,sourceEnd, destStart,destEnd:Point;
  344.                           mode:RasterMode; setCol,unsetCol:CARDINAL);
  345.                          
  346. BEGIN
  347.   ASSEMBLER
  348.         MOVE.L  lineAVars,A0
  349.         MOVE.L  -(A3),-(A7)
  350.         MOVE.W  -(A3),-(A7)
  351.         MOVE.L  A7,lineAVars.intin(A0)
  352.         LEA     -16(A3),A1
  353.         MOVE.L  A1,lineAVars.ptsin(A0)
  354.         MOVE.L  -4(A1),-(A7)
  355.         MOVE.L  -8(A1),-(A7)
  356.         CLR.L   -(A7)
  357.         CLR.L   -(A7)
  358.         CLR.L   -(A7)
  359.         CLR.W   -(A7)
  360.         MOVE.L  A7,lineAVars.contrl(A0)
  361.         
  362.         MOVE.L  A6, -(A7)
  363.         DC.W    copyRasterCode
  364.         MOVE.L  (A7)+, A6
  365.         ADDA.W  #28,A7
  366.         SUBA.W  #24,A3
  367.   END;
  368. END CopyRasterForm;
  369.  
  370. PROCEDURE ContourFill (p:Point; color:CARDINAL; useColor:BOOLEAN);
  371.  
  372. BEGIN
  373.   ASSEMBLER
  374.         MOVE.L  lineAVars,A0
  375.         TST.W   -(A3)
  376.         BNE     cont
  377.         MOVE.W  #-1,-2(A3)
  378. cont
  379.         LEA     -6(A3),A1
  380.         MOVE.L  A1,LineAVars.ptsin(A0)
  381.         ADDQ.L  #4,A1
  382.         MOVE.L  A1,LineAVars.intin(A0)
  383.         
  384.         MOVE.L  A6, -(A7)
  385.         DC.W    contourFillCode
  386.         MOVE.L  (A7)+, A6
  387.         SUBQ.L  #6,A3
  388.   END;
  389. END ContourFill;
  390.  
  391.  
  392.  
  393. BEGIN
  394.   ASSEMBLER
  395.         MOVE.L  A6, -(A7)
  396.         DC.W    initCode                ; Initialisierung der Line-A-Routinen
  397.         MOVE.L  (A7)+, A6
  398.         MOVE.L  D0,lineAVars
  399.         MOVE.L  A1,sysFontHeader
  400.         MOVE.L  A2,jmpTable
  401.         
  402.         CLR.W   ImprovedCall            ; Variablen initalisieren
  403.   END;
  404. END LineA.
  405. ə
  406. (* $FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$000008B6$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843$FFFB0843Ç$000001C0T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001EB4$00001F61$000020D0$000021BA$000022FD$00002600$000027FA$0000002B$00000AE4$0000018B$0000019A$000001C0$00001289$000014F2$0000161F$00001D00ãÇü*)
  407.